//package com.tsx.ai.chat.config;
//
//import cn.hutool.core.util.StrUtil;
//import com.tsx.ai.chat.annotation.DCCValue;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.redisson.api.RBucket;
//import org.redisson.api.RTopic;
//import org.redisson.api.RedissonClient;
//import org.springframework.aop.framework.AopProxyUtils;
//import org.springframework.aop.support.AopUtils;
//import org.springframework.beans.BeansException;
//import org.springframework.beans.factory.config.BeanPostProcessor;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
//import java.lang.reflect.Field;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//
//@Configuration
//@Slf4j
//@RequiredArgsConstructor
//public class DCCConfig implements BeanPostProcessor {
//    private final String SPLIT = "-";
//    private final String BASE_CONFIG_PATH = "ai-chat-dcc:";
//    // 存储属性值和对象的对应关系
//    private final Map<String, Object> dccObjGroup = new ConcurrentHashMap<>();
//    private final RedissonClient redissonClient;
//
//    @Bean("dccTopic")
//    public RTopic dccRedisTopicListener() {
//        RTopic topic = redissonClient.getTopic("ai-chat-topic");
//        topic.addListener(String.class, (charSequence, s) -> {
//            String[] split = s.split(SPLIT); // 属性名-属性值
//            String attribute = split[0];
//            String key = BASE_CONFIG_PATH + attribute;
//            String value = split[1];
//            // 查看是否存在
//            RBucket<String> bucket = redissonClient.getBucket(key);
//            if (!bucket.isExists()) return;
//            bucket.set(value);
//            // 获取关联的Bean对象（从内存缓存dccObjGroup中查找）
//            Object objBean = dccObjGroup.get(key);
//            if (objBean == null) return;
//
//            // 处理AOP代理对象（获取原始类）
//            Class<?> objBeanClass = objBean.getClass();
//            if (AopUtils.isAopProxy(objBean)) {
//                objBeanClass = AopUtils.getTargetClass(objBean); // 获取目标类
//            }
//
//            // 反射更新字段值
//            try {
//                Field field = objBeanClass.getDeclaredField(attribute); // 获取字段
//                field.setAccessible(true); // 突破私有权限
//                field.set(objBean, value); // 设置新值（如downgradeSwitch=1）
//                field.setAccessible(false);
//                log.info("DCC 节点监听，动态设置值 {} {}", key, value);
//            } catch (Exception e) {
//                log.error("DCC 节点监听，动态设置值 {} {} 失败", key, value, e);
//                throw new RuntimeException(e);
//            }
//        });
//        return topic;
//    }
//
//    @Override
//    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//        Class<?> targetBeanClass = bean.getClass();
//        Object targetBeanObject = bean;
//        if (AopUtils.isAopProxy(targetBeanClass)) {
//            targetBeanClass = AopUtils.getTargetClass(targetBeanClass);
//            targetBeanObject = AopProxyUtils.getSingletonTarget(targetBeanObject);
//        }
//        Field[] fields = targetBeanClass.getDeclaredFields();
//        for (Field field : fields) {
//            if (!field.isAnnotationPresent(DCCValue.class)) {
//                continue;
//            }
//            DCCValue dccValue = field.getAnnotation(DCCValue.class);
//            String value = dccValue.value();
//            if (StrUtil.isBlank(value)) {
//                throw new RuntimeException("DCCValue配置错误");
//            }
//            String[] split = value.split(":");
//            if (split.length != 2) {
//                throw new RuntimeException("DCCValue配置错误");
//            }
//            String key = BASE_CONFIG_PATH + split[0]; // 构造key 项目名和属性名拼接
//            String defaultValue = split[1];
//
//            // 初始化配置值（优先从Redis读取，无则写入默认值）
//            try {
//                RBucket<String> bucket = redissonClient.getBucket(key);
//                if (!bucket.isExists()) {
//                    bucket.set(defaultValue); // 设置默认值到Redis
//                }
//                String redisValue = bucket.get();
//                String setValue = redisValue != null ? redisValue : defaultValue;
//
//                // 反射注入字段值
//                field.setAccessible(true);
//                field.set(targetBeanObject, setValue); // 如downgradeSwitch=0
//                field.setAccessible(false);
//                // 缓存对象（用于后续动态更新）
//                dccObjGroup.put(key, targetBeanObject);
//            } catch (Exception e) {
//                throw new RuntimeException(e);
//            }
//        }
//        return bean;
//    }
//}
